package top.hekun.study.tree;

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.util.Printer;
import org.objectweb.asm.util.TraceClassVisitor;
import top.hekun.study.core.util.ClassFileUtil;
import top.hekun.study.tree.util.TreePrinter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 工具类, 用来打印tree 生成的代码
 */
public class AsmTreeToolDemo {

    // 读取class文件 输出为ASM代码
    public static void main(String[] args) throws IOException {
        // 设置参数 或者直接给 ClassReader 传类的全名称
        byte[] classBytes = ClassFileUtil.getClassFileByteToClassName("HelloWord");
        // 分析选项  SKIP_CODE 跳过代码码  SKIP_DEBUG  跳过测试  SKIP_FRAMES 跳过帧  EXPAND_FRAMES 展开框架  可组合使用 也可以是 0
        int parsingOptions = ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG;
        // 打印结果
        // 设置打印工具
        String className = "HelloWordTreeDump";
        Printer printer = new TreePrinter();
        File classFileModelPath = ClassFileUtil.getClassFileModelPath();
        File file = new File(ClassFileUtil.getClassFileModelPath(), className + ".java");
        FileOutputStream outputStream = new FileOutputStream(file, false);
        // 打印编写器
        PrintWriter printWriter = new PrintWriter(outputStream, true);
        // 追踪类工具
        TraceClassVisitor traceClassVisitor = new TraceClassVisitor(null, printer, printWriter);
        // 类读取器 并且解析
        new ClassReader(classBytes)
                .accept(traceClassVisitor, parsingOptions);

        outputStream.close();
    }


}
